package store.lunangangster.nodeflow.config;

import store.lunangangster.nodeflow.context.holder.FlowContextHolder;

/**
 * 用于保存和获取NodeFlowConfig的类
 * 
 * @author cwk
 * @version 1.0
 */
public class NodeFlowConfigHolder {
	private static volatile NodeFlowConfig config;

	/**
	 * 通过spi获取相应的全局配置对象
	 * <p>对于本地环境，第一次调用时会进行创建，后续调用时将复用之前的对象
	 * <p>对于Spring环境，NodeFlowConfig会保存在IOC容器中，该方法会从IOC容器中获取NodeFlowConfig对象
	 * @return	全局配置
	 */
	public static NodeFlowConfig getConfig() {
		if (config == null) {
			synchronized (NodeFlowConfigHolder.class) {
				if (config == null) {
					// probable be null in Local or Spring environment, must not be null in SpringBoot
					NodeFlowConfig contextConfig = FlowContextHolder.getContext().getBean(NodeFlowConfig.class);
					if (contextConfig == null) {
						config = new NodeFlowConfig();
					} else {
						config = contextConfig;
					}
				}
			}
		}
		return config;
	}

	/**
	 * 设置全局配置
	 * @param config	NodeFlowConfig对象
	 */
	public static void setConfig(NodeFlowConfig config) {
		NodeFlowConfigHolder.config = config;
	}
}
